package web.ctroller;

import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import pojo.Code;
import pojo.User;
import web.exhandlers.BusinessException;

import java.util.Date;

@Controller
@RequestMapping("/resp")

//标识哪些key的数据需要存入到session中
@SessionAttributes({"msg"})
public class ResponseController {

    @RequestMapping("/test1/{name}")
    public String test1(@PathVariable("name") String name, Model model){
        System.out.println("test1...");
        System.out.println("name:" + name);

        //通过Model对象，向页面携带数据
        //默认情况下，这个model中的数据是存入到request域对象中
        //如果想将数据存入到session域，需要在类上用一个注解标注-@SessionAttributes
        model.addAttribute("msg","hello mvc model...");

        return "redirect:/test.jsp";
    }

    @RequestMapping("/test2/{name}")
    public ModelAndView test2(@PathVariable("name") String name){
        System.out.println("test2...");
        System.out.println("name:" + name);

        //封装一个ModelAndView返回 - 封装数据+视图的
        ModelAndView mav = new ModelAndView();

        //添加数据
        mav.addObject("msg","hello modelandview model...");
        mav.setViewName("forward:/test.jsp");

        return mav;
    }

    @RequestMapping(value = "/test3/{name}",produces = "text/html;charset=utf-8")

    /*
        表示这个返回值不是一个视图，是一个具体的响应体内容,不要跳转页面
            1、如果返回值是String，内部在将返回数据进行转换时使用的是 StringHttpMessageConverter,这个对象内部使用的码表默认是ISO-8859-1
                public static final Charset DEFAULT_CHARSET = StandardCharsets.ISO_8859_1; 所以默认不支持中文

                解决方式一：在@RequestMapping注解上配置produces属性为text/html;charset=utf-8，类似于javaweb中的response.setContentType("text/html;charset=utf-8")
                    缺点：每一个方法都需要手动配置，麻烦

                解决方式二：改变StringHttpMessageConverter对象的默认码表
                        <mvc:annotation-driven>
                            <mvc:message-converters>
                                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                                    <property name="defaultCharset" value="utf-8"/>
                                </bean>
                            </mvc:message-converters>
                        </mvc:annotation-driven>

            2、如果返回值不是String，而是一个对象或者集合，内部使用的 MappingJackson2HttpMessageConverter ，这个对象内部的默认码表是UTF-8
                ENCODINGS.put("US-ASCII", JsonEncoding.UTF8); 所以中文不存在乱码的
     */
    @ResponseBody  //内部也是需要Jackson依赖支持
    public String test3(@PathVariable("name") String name){
        System.out.println("test3...");
        System.out.println("name:" + name);

        int i = 1/0;

        //响应中文乱码
        return "你好，springmvc...";
    }

    @RequestMapping("/test4/{name}")
    @ResponseBody  //内部也是需要Jackson依赖支持
    public String test4(@PathVariable("name") String name){
        System.out.println("test4...");
        System.out.println("name:" + name);

        int i = 1/0;

        //响应中文乱码
        return "你好，springmvc...";
    }

    // 注意返回值不是String
    @RequestMapping("/test5/{name}")
    @ResponseBody  //内部也是需要Jackson依赖支持，内部会自动将对象或者集合利用Jackson工具转成Json格式的字符串
    public User test5(@PathVariable("name") String name){
        System.out.println("test4...");
        System.out.println("name:" + name);

        User user = new User();
        user.setAge(18);
        user.setUname("张三");
        user.setBir(new Date());

        //响应中文不存在乱码
        return user;
    }

    /*
        演示跨域访问
     */
    @RequestMapping("/test6")
    @ResponseBody

    //前端发送异步请求时，如果允许携带cookie信息，那么后端允许访问的origins不能是*，必须是具体的服务器
    //后端服务器还需要配置allowCredentials ，允许认证信息（Cookie）的携带
    @CrossOrigin(origins = {"http://localhost:81"},allowCredentials = "true") //解决跨域问题
    public String test6(@RequestBody User user){
        System.out.println("test6...");
        System.out.println("user:" + user);
        return "success~~";
    }


    @RequestMapping("/test7/{age}")
    @ResponseBody  //内部也是需要Jackson依赖支持，内部会自动将对象或者集合利用Jackson工具转成Json格式的字符串
    public String test7(@PathVariable("age") Integer age){
        System.out.println("test4...");
        System.out.println("name:" + age);

        if (age < 0 || age > 150){
            throw new BusinessException(Code.ERROR_AGE);
        }

        return "success";
    }
}
